package com.hailiang.study.javase.java.util.concurrent;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;

/**
 * 并行执行一批任务，等待耗时最长的任务完成之后，再处理所有任务的结果。
 * @author hailiang.jiang
 * @date 2021年07月31 22:56
 */
public class ExecutorService_invokeAll {

    public static void main(String[] args) throws InterruptedException {
        // 创建两个任务
        Callable<Integer> task01 = () -> {
            TimeUnit.SECONDS.sleep(3);
            System.out.println(String.format("[%s] task01 finished", Thread.currentThread().getName()));
            return 1;
        };

        Callable<Integer> task02 = () -> {
            TimeUnit.SECONDS.sleep(10);
            System.out.println(String.format("[%s] task02 finished", Thread.currentThread().getName()));
            return 2;
        };

        // 创建线程池
        ExecutorService service = Executors.newFixedThreadPool(2);
        // 调用invokeAll方法，批量提交一组任务
        List<Future<Integer>> futures = service.invokeAll(Arrays.asList(task01, task02));

        futures.forEach(future -> {
            // 在这里获取任务的返回值时，会等待所有任务都执行完才返回结果
            try {
                Integer result = future.get();
                System.out.println("[" + Thread.currentThread().getName() + "]" + " " + result);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        });

        // 关闭线程池
        service.shutdown();
    }
}
